// 定义小仓库（选择式Api写法）
import { defineStore } from "pinia";
import settings from "@/settings";
import type { ILoginParams } from "@/api/system/user/type";
import type { IUserState } from "@/store/types/index.ts";
// import { koiLogin } from "@/api/user/index.ts";
// import { getToken } from "@/utils/storage.ts";
// 第一个仓库：小仓库名字。第二个参数：小仓库配置对象
// defineStore方法执行会返回一个函数，函数的作用就是让组件可以获取到仓库数据
const userStore = defineStore("user", {
  // 开启数据持久化
  // persist: true,
  // 持久化存储插件其他配置
  persist: {
    key: settings.storagePrefix + "user", // 默认会以 store 的 id 作为 key
    storage: sessionStorage,
  },
  // 可以通过为属性指定选项来配置持久化方式persist
  // persist: {
  //     paths: ['isCollapse'],
  //     storage: sessionStorage
  // },
  // 存储数据state
  state: (): IUserState => {
    return {
      token: "",
      userId: "",
      username: "",
      nickname: "",
      avatar: "",
      routeList: [],
      roleList: [],
      buttonList: [],
    };
  },
  actions: {
    // 该函数没有上下文数据，所以获取state中的变量需要使用this
    // 没有了commit AND mutations去修改数据
    async koiLogin(data: ILoginParams) {
      // 注意：async就近原则加，不要跳跃方法加，否则出错
      // 用户登录方法
      console.log("登录-账号密码验证码：", data);
      this.token = "YU-ADMIN-TOKEN";
      this.userId = "666";
      this.username = "YU-ADMIN🌻";
      this.nickname = "王将(管理员)";
      this.avatar =
        "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Fae90b4c7-98b6-4a47-b1b3-9ee8bc71acf6%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1692146441&t=6fca60f3a0d323869b81d8fb53b5dd1b";
      this.roleList = ["YU-ADMIN", "COMMON"];
      this.buttonList = [
        "system:role:search",
        "system:role:add",
        "system:role:update",
        "system:role:delete",
        "system:role:export",
        "system:role:import",
      ];
      return "ok";

      // try {
      //   // 登录请求
      //   const res: any = await koiLogin(data);
      //   // pinia仓库进行存储
      //   this.token = res.data; // 保证必须是字符串的情况下进行赋值
      //   return "ok";
      // } catch (error) {
      //   console.log("登录失败原因：", error); // 后端返回异常信息，全局拦截器返回过来
      //   // 为什么出现异常不在这里处理，因为这里没办法跟页面交互，一般不使用，因为有全局拦截
      //   return Promise.reject(error);
      // }
    },
  },
  // 计算属性，和vuex是使用一样，getters里面不是方法，是计算返回的结果值，这个传值要用 getUserName(state){ return state.username }
  getters: {
    getUserId(state){
      return state.userId;
    },
    getToken(state){
      return state.token;
    }
  },
});

// 对外暴露方法
export default userStore;
